package lm.concurrency.day7;

import java.time.DayOfWeek;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * @Auther: Min.Liu
 * @Description:
 * @Date: Created in 14:56 2024/5/16
 */
public class ScheduleTest {
    /**
     * 主函数，演示如何定时在每周四的 18:00:00 执行任务。
     * 任务首次在当前时间之后最近的周四执行，之后每隔一周在同一时间执行。
     */
    public static void main(String[] args) {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        // 计算本周四或下周四的 18:00:00 时间
        LocalDateTime time = now.withHour(18).withMinute(0).withSecond(0).withNano(0).with(DayOfWeek.THURSDAY);
        if(now.compareTo(time) > 0) {
            // 如果当前时间晚于本周四的 18:00:00，则设定为下一周四的同一时间
            time = time.plusWeeks(1);
        }
        System.out.println(time);

        // 计算初始延迟和周期
        long initailDelay = Duration.between(now, time).toMillis();
        long period = 1000 * 60 * 60 * 24 * 7; // 每周的周期毫秒数

        // 创建一个定时任务执行器
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);

        // 安排任务执行，任务为打印"running..."，首次执行在initailDelay后，之后每隔period执行一次
        pool.scheduleAtFixedRate(() -> {
            System.out.println("running...");
        }, initailDelay, period, TimeUnit.MILLISECONDS);
    }
}
